package cn.chiship.sdk.core.util;

import java.util.Date;
import java.util.HashMap;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**
 * 资源文件读取工具
 *
 * @author lijian
 */
public class PropertiesFileUtil {

	/**
	 * 当打开多个资源文件时，缓存资源文件
	 */
	private static HashMap<String, PropertiesFileUtil> configMap = new HashMap<>();

	/**
	 * 打开文件时间，判断超时使用
	 */
	private Date loadTime = null;

	/**
	 * 资源文件
	 */
	private ResourceBundle resourceBundle = null;

	/**
	 * 默认资源文件名称
	 */
	private static final String NAME = "config";

	/**
	 * 缓存时间
	 */
	private static final Integer TIME_OUT = 60 * 1000;

	/**
	 * 私有构造方法，创建单例
	 * @param name
	 */
	private PropertiesFileUtil(String name) {

		this.loadTime = new Date();
		this.resourceBundle = ResourceBundle.getBundle(name);

	}

	public static synchronized PropertiesFileUtil getInstance() {

		return getInstance(NAME);

	}

	public static synchronized PropertiesFileUtil getInstance(String name) {

		PropertiesFileUtil conf = configMap.get(name);
		if (StringUtil.isNull(conf)) {
			conf = new PropertiesFileUtil(name);
			configMap.put(name, conf);
		}

		// 判断是否打开的资源文件是否超时1分钟
		if ((System.currentTimeMillis() - conf.getLoadTime().getTime()) > TIME_OUT) {
			conf = new PropertiesFileUtil(name);
			configMap.put(name, conf);
		}

		return conf;

	}

	/**
	 * 根据key读取value
	 * @param key
	 * @return 结果
	 */
	public String get(String key) {

		try {
			return resourceBundle.getString(key);
		}
		catch (MissingResourceException e) {
			return "";
		}

	}

	/**
	 * 根据key读取value(整形)
	 * @param key
	 * @return 结果
	 */
	public Integer getInt(String key) {

		try {
			String value = resourceBundle.getString(key);
			return Integer.parseInt(value);
		}
		catch (MissingResourceException e) {
			return null;
		}

	}

	/**
	 * 根据key读取value(布尔)
	 * @param key
	 * @return 结果
	 */
	public boolean getBool(String key) {

		try {
			String value = resourceBundle.getString(key);
			String booleanStr = "true";
			return booleanStr.equals(value);
		}
		catch (MissingResourceException e) {
			return false;
		}

	}

	public Date getLoadTime() {

		return loadTime;

	}

}
